﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
using NHibernate.Criterion;
using ClienteServices.Dominio;

namespace ClienteServices.Persistencia
{
    public class BaseDAO<Entidad, Id>
    {
        public Entidad Crear(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Save(entidad);
                sesion.Flush();
            }
            return entidad;
        }
        public Entidad Obtener(string dni)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {

                return (Entidad)sesion.CreateCriteria<Cliente>().Add(Restrictions.Eq("dni", dni)).SetMaxResults(1).UniqueResult();
            }
        }


        public Entidad ObtenerXCorreo(string correo)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {

                return (Entidad)sesion.CreateCriteria<Cliente>().Add(Restrictions.Eq("correo", correo)).SetMaxResults(1).UniqueResult();
            }
        }

        public Cliente Modificar(Cliente entidad)
        {
            Cliente e;
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {

                e=(Cliente)sesion.CreateCriteria<Cliente>().Add(Restrictions.Eq("dni", entidad.dni)).SetMaxResults(1).UniqueResult();
                e.nombre = entidad.nombre;
                e.telefono = entidad.telefono;
                e.correo = entidad.correo;
                e.cumpleaños = entidad.cumpleaños;
                e.dni = entidad.dni;
                
                sesion.Update(e);
                sesion.Flush();
            }
            return e;
        }
        public void Eliminar(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Delete(entidad);
                sesion.Flush();
            }
        }
        public ICollection<Entidad> ListarTodos()
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                ICriteria busqueda = sesion.CreateCriteria(typeof(Entidad));
                return busqueda.List<Entidad>();
            }
        }


        public Entidad ObtenerxId(Id id)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                return sesion.Get<Entidad>(id);
            }
        }
    }
}